<?php
class 入力ツール
{
	/**
	 * 要求要素定数
	 */
	const ボックス = 'box';
	const ラベル = 'label';
	const 両方 = 'both';
	/**
	 * ラジオボタンタグコード生成
	 * @param  $name ネーム属性値
	 * @param  $value 値
	 * @param  $selectValue 初期選択値
	 * @param  $disp 表示対象
	 * @param  $attr その他属性（連想配列：プロパティ＝＞バリュー）
	 * @return string ラジオボタンタグコード
	 */
	static public function ラジオボタン( $name, $value, $selectValue, $disp, $attr=array())
	{
		$ret = '';
		$ret = self::ラジオチェックボタン共通('radio', $name, $value, $selectValue, $disp, $attr);
		return $ret;
	}
	/**
	 * チェックボックスタグコード生成
	 * @param  $name ネーム属性値
	 * @param  $value 値
	 * @param  $selectValue 初期選択値
	 * @param  $disp 表示対象
	 * @param  $attr その他属性（連想配列：プロパティ＝＞バリュー）
	 * @return string チェックボックスタグコード
	 */
	static public function チェックボックス( $name, $value, $selectValue, $disp, $attr=array())
	{
		$ret = '';
		$ret = self::ラジオチェックボタン共通('checkbox', $name, $value, $selectValue, $disp, $attr);
		return $ret;
	}
	/**
	 * ラジオチェックボタン共通
	 * @param $type 入力タイプ(radio|checkbox)
	 * @param  $name ネーム属性値
	 * @param  $value 値
	 * @param  $selectValue 初期選択値
	 * @param  $disp 表示対象
	 * @param  $attr その他属性（連想配列：プロパティ＝＞バリュー）
	 * @return string チェックボックスタグコード
	 */
	static public function ラジオチェックボタン共通($type, $name, $value, $selectValue, $disp, $attr=array())
	{
		$result = '';
		/* 初期選択状態判定 */
		switch ($value) {
			case $selectValue:
			case NULL:
				$attr['checked'] = '';
				break;
		}
		$attribute = self::属性生成($attr);
		$box = str_replace('{?TYPE?}', $type, INPUT_TOOL_INPUT);
		$box = str_replace('{?NAME?}', $name, $box);
		$box = str_replace('{?VALUE?}', $value, $box);
		$box = str_replace('{?ATTR?}', $attribute, $box);
		$label = str_replace('{?VALUE?}', $value, INPUT_TOOL_LABEL);
		/* 表示レベル判定 */
		switch ($disp) {
			case self::ボックス:
				$result = $box;
				break;
			case self::ラベル:
				$result = $label;
				break;
			default:
				$result = $box . ' ' . $label;
				break;
		}
		return $result;
	}
	/**
	 *
	 * @param 連想配列 $attr
	 * @return string
	 */
	static public function 属性生成($attr)
	{
		$ret = '';
		/* 全エントリ走査 */
		foreach ($attr as $property=>$value) {
			/* スペース区切り挿入 */
			if ($ret != '') {
				$ret .= ' ';
			}
			/* バリュー無しのプロパティ判定 */
			if ($value == '') {
				$ret .= $property;
			} else {
				$ret .= sprintf('%s="%s"',$property,$value);
			}
		}
		return $ret;
	}
}
/**
 * テンプレート定数
 */
define ('INPUT_TOOL_INPUT',
<<<EOD
<input type="{?TYPE?}" name="{?NAME?}" value="{?VALUE?}" {?ATTR?} id="{?VALUE?}" />
EOD
	);
define('INPUT_TOOL_LABEL',
<<<EOD
<label for="{?VALUE?}">{?VALUE?}</label>
EOD
	);

/* ユニットテストブロック */
/**
 * *ユニットテスト時以外で以下のコードを無効にする
 */
if (defined('SIMPLETEST_PRELOAD')) {
	/**
	 * simpletest UNIT TEST CASE
	 */
	class 入力ツールTest extends UnitTestCase {
		public function test_ラジオボタン０１()
		{
			$ret = 入力ツール::ラジオボタン('radio1', '花', '', 入力ツール::ボックス);
			$this->assertEqual($ret, '<input type="radio" name="radio1" value="花"  id="花" />');
			$ret = 入力ツール::ラジオボタン('radio1', '花', '', 入力ツール::ラベル);
			$this->assertEqual($ret, '<label for="花">花</label>');
			$ret = 入力ツール::ラジオボタン('radio1', '花', '', 入力ツール::両方);
			$this->assertEqual($ret, '<input type="radio" name="radio1" value="花"  id="花" /> <label for="花">花</label>');
			$ret = 入力ツール::ラジオボタン('radio1', '亀', '亀', 入力ツール::両方);
			$this->assertEqual($ret, '<input type="radio" name="radio1" value="亀" checked id="亀" /> <label for="亀">亀</label>');
			$ret = 入力ツール::チェックボックス('check1', '花', '', 入力ツール::両方);
			$this->assertEqual($ret, '<input type="checkbox" name="check1" value="花"  id="花" /> <label for="花">花</label>');
			$ret = 入力ツール::チェックボックス('check1', '亀', '亀', 入力ツール::両方);
			$this->assertEqual($ret, '<input type="checkbox" name="check1" value="亀" checked id="亀" /> <label for="亀">亀</label>');
			echo $ret."\n";
		}
		/**
		 * 被検アクションコントローラインスタンス作成
		 * (non-PHPdoc)
		 * @see SimpleActionControllerTester::setUp()
		 */
		public function setUp() {
			parent::setUp ();
			$this->controller = new 入力ツール();
		}
		/**
		 * テンプレートに設定される値をテストする例
		 */
		public function test_サンプル０１() {
		}
		/**
		 * public ではないメソッドをテストする例
		 */
		public function test_プロテクトメソッド０１() {
//			$this->_invokeReflectionedMethod ( 'テストするメソッド名', '引数１', '引数２', '引数は5個まで' );
		}
		/**
		 * 外部クラスのメソッドを替え玉クラスのメソッドに入れ替える例
		 */
		public function test_外部メソッド操作０１() {
//			$this->_switchClassMethod ( '外部クラス名', '外部クラスのメソッド名', '替え玉クラス名', '替え玉クラスのメソッド名' );
		}
	}
	/**
	 * 替え玉メソッドクラスの例（自由に実装してさしつかえない）
	 */
	class 替え玉メソッドクラス {
		public function relief01() {
			return FALSE;
		}
	}
	/* headerメソッドの機能を変更し発行ヘッダを評価できるようにする*/
	runkit_function_remove ( 'header' );
	$redirectUrl = '';
	function header($string) {
		GLOBAL $redirectUrl;
		$redirectUrl = $string;
	}
}
